版本控制

文件配置

有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。
git config --list

# core.autocrlf=true

git会自动转换换行符,导致提交时有多余的文件被更改.进行一下设置修复

# 提交检出均不转换
git config --global core.autocrlf false 

# 拒绝提交包含混合换行符的文件
git config --global core.safecrlf true 

# 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
  • 中文设置

中文乱码: git status


# git config --global core.quotepath false               # 对 0×80 以上的字符进不进行进行转义编码
  • 中文乱码: git log
# 注:全局配置还是当前项目配置看具体情况

# git config --global gui.encoding utf-8                 # 根据本地编码选择图形界面的编码

# git config --global i18n.commit.encoding utf-8         # 根据本地编码选择提交信息的编码

# git config --global i18n.logoutputencoding utf-8       # 根据本地编码环境选择日志的编码

# i18n 是 internationalization 的简称, 数字基于首尾英文单字长度
*.log             #忽略所有日志文件

!except.log       #不忽略该文件

vendor/           #忽略文件夹

/config           #忽略文件

工具配置

  • IDE 配置

当更改 IDETerminalGit Bash 时有可能会出现 git log 仍然乱码,这种情况下需要更改 IDE 设置

# 以 PhpStorm 为例

# 编辑: phpstorm64.exe.vmoptions 添加

-Dfile.encoding=UTF-8

# 编辑: phpstorm.exe.vmoptions   添加

-Dfile.encoding=UTF-8

编辑 Git 文件

# 编辑: bash.bashrc 添加

export LANG="zh_CN.UTF-8"

export LC_ALL="zh_CN.UTF-8"
  • Cmder 更改 λ 为 $

打开文件,搜索 λ 将 λ 改为 $ 即可

# git

Cmder\vendor\git-for-windows\etc\profile.d\git-prompt.sh

# Cmder

Cmder\vendor\clink.lua
  • Bash配置

右键点击进入 Bash 的设置界面, Text选项 改为 Local:zh_CN, Character:UTF-8

# 设置 HTTP 代理
git config --global http.proxy http://127.0.0.1:8118
git config --global https.proxy http://127.0.0.1:8118

# 设置 SOCKS5 代理
git config --global http.proxy socks5://127.0.0.1:1080
git config --global https.proxy socks5://127.0.0.1:1080

# 取消代理设置
git config --global --unset http.proxy
git config --global --unset https.proxy

分支相关

  • 头指针游离
# 切换到某一历史版本
git checkout bda7532839a90de23e7a71017ed2c56816d6f8b2

# 比较两个分支间的修改
git diff master origin/dev

# 比较两个分支间的提交记录
git cherry local/dev  upstream/master 

# 查看分支的提交记录
git log branchName
# 默认推送到与当前分支同名的远程分支
git config core.push current

# 默认拉取到与当前分支同名的远程分支
git config core.pull current
# 查看本地分支的详细信息
git branch -vv

  bug    506ac405 [upstream/master] Merge branch 'bug_send_appmsg' into 'master'
  dev    506ac405 [upstream/dev] Merge branch 'bug_send_appmsg' into 'master'
* master a5ee1b00 [upstream/master: behind 2] Merge branch 'req_net_mail_en' into 'master'

# 设置关联的远程分支
git branch --set-upstream-to=remote_repository/target_remote_branch current_branch

# 设置关联的远程分支
git branch -u remote_repository/target_remote_branch current_branch

# 设置关联的远程分支(名字相同)
git branch -u origin/$(git rev-parse --abbrev-ref HEAD)

# 推送并关联远程分支
git push -u origin/branch

# 推送并关联远程分支
git push --set-upstream origin/branch
# 查看所有分支
git branch -a

# 查看远程分支
git branch -r

# 查看远程仓库信息
git remote show origin

# 删除本地跟踪(已被删除的远程分支,本地还追踪着)
git remote prune origin 

# 批量删除本地分支
git branch | grep -v -E 'master|dev' | xargs git branch -D

# 删除远程分支
git push origin :branch_name

# 复制一个远程分支到本地
git checkout -b dev origin/dev

# 更改分支名称
git branch -m old_name new_name

头指针游离 : HEAD detached at bda7532

需要注意的是游离状态下的提交是无法可见保存的,一旦切到别的分支,游离状态以后的提交就不可追溯了.解决办法是新建一个分支保存游离状态后的提交

版本历史

  • 重写最近提交历史(未推送)
# 重写最近提交历史(未推送)
git commit --amend

# 强制提交
git push origin branch -f

# 回退更改
git checkout .

# 查看某个提交的具体内容
git show commit_id
  • 合并提交分支
# 合并提交分支

git rebase upstream/master

# 合并其他分支的提交到当前分支

git cherry-pick acddaa967

# 获取区间段的提交( [首尾都是闭区间] ) (注意提交的时间顺序)

git cherry-pick acddaa967^..asd1123

# 获取区间段的提交( (尾是开区间首是闭区间] ) (注意提交的时间顺序)
  • 冲突解决
# 配置冲突解决工具

git config --global merge.tool vimdiff
#暂存代码
git stash save [message]

# 查看暂存列表
git stash list

#恢复暂存
git stash apply

#恢复指定的暂存
git stash apply stash@{1}

#移除暂存代码
git stash drop stash@{1}

#恢复并移除第一个暂存
git stash pop

#恢复并移除指定暂存
git stash pop stash@{1}
在 Windows 下 stash 速度慢

使用内建指令需要版本 > 1.9

# 更新版本( 2.14.2 - 2.16.1)

    git update
    
# 更新版本( > 2.16.1)
    git update-git-for-windows

# 使用内建指令(rebase)

    git config --global rebase.useBuiltin true

# 使用内建指令(stash)

    git config --global stash.useBuiltin true

撤销更改

git revert 是用一次新的 commit 来回滚之前的 commit 而 git reset 是直接删除指定的 commit
# 撤销已经更改但是还没保存的文件
git checkout .

# 撤销更改的文件
git reset --hard

# 回滚到指定提交
git reset commit_id

# 回滚到前两个提交
git reset HEAD^^

# 取消指定提交的内容
git revert commit_id

# 取消第二个的提交
git reset HEAD^^

-- 用以标识后面跟随的是文件而不是分支,git checkout 是针对分支的命令,当找不到分支时会去查找文件,所以某些情况下 checkout . 与 checkout -- . 是等效的

缓存管理

# 清除缓存
git rm -r --cached .

# 追踪本地文件
git add .

# 保存更改
git commit -am 'updateCache'

# 查看将要删除的未追踪的文件
git clean -nf

# 删除未追踪的文件
git clean -f

# 删除未追踪的文件和目录
git clean -fd

# 删除未追踪的文件和目录和编译文件
git clean -fdx

代码托管

Git Hub
  • 项目相关

创建/查看目标用户的公钥,并添加 Git 公钥,使之能拉取/提交代码

  • 项目语言
# 问题原因
github 是根据项目里文件数目最多的文件类型,识别项目类型

# 解决办法

项目根目录添加 .gitattributes 文件, 将指定文件类型设置为目标语言,内容如下 :
*.swift linguist-language=object-c
Git Lab
从远程检出特定的合并请求。例如,要检查ID为5的合并请求:git mr upstream 5
# 编辑配置
git config --edit

# 添加拉去合并请求的命令
[alias]
    mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' -
    
# 从远程仓库获取最新的代码
git fetch upstream

# 获取最新代码并设置远程分支与本地引用的映射关系
git fetch upstream <src>:<dst> 

注意: 强制提交最好用在个人仓库,协作开发还是合并为好

# gitlab允许强制提交
unprotect branch

# 强制提交
git push -f

# 指定仓库强制提交
git push -u origin master -f

相关文章

PHP 规范开发(一):断点调试
PHP 规范开发(二):单元测试
PHP 规范开发(三):版本控制与协作开发
PHP 规范开发(四):重构、代码规范及设计模式


半斤桃花
83 声望8 粉丝

学无止境